/*:
 * @plugindesc 疊加方面的性能修正
 * @author 小c
 * @version 1.00
 * @date 12/30/2023
 *
 * @help
 * reduce內concat會有性能陷阱。
 * 垃圾RM，名不虛傳。
 * 本插件必須儘量前置，放在所有插件的最前。
 * 用來解決裝備/狀態/結算掉落過多時的卡頓。
 * 
 * 舉個例子：
 * Game_BattlerBase.prototype.allTraits = function(){
 *   return this.traitObjects().reduce(function(r, obj){
 *       return r.concat(obj.traits);
 *   }, []);
 * };
 * 當traitObjects數組較長時，reduce+concat將會有嚴重的性能損耗。
 * 原理：
 * concat會創建原數組副本後操作數組連接。在反覆調用concat後會有非常大量
 * 的新對象創建，從而產生大量的垃圾回收，嚴重影響性能。
 * 處理方法可改為 Array.prototype.push.apply(arr1, arr2);
 * 即將數組arr2接在數組arr1的後面
 */

Game_BattlerBase.prototype.allTraits = function(){
    let allTraits = [];
    const objects = this.traitObjects();
    for(let i = 0; i < objects.length; i++)
        Array.prototype.push.apply(allTraits, objects[i].traits);
    return allTraits;
};

Game_BattlerBase.prototype.traitsSet = function(code){
    let traitsSet = [];
    const traits = this.traits(code);
    for(let i = 0; i < traits.length; i++)
        traitsSet.push(traits[i].dataId);
    return traitsSet;
};

Game_Enemy.prototype.makeDropItems = function(){
    let drops = [];
    const allDropItems = this.enemy().dropItems;
    const dropItemRate = this.dropItemRate();
    for(let i = 0; i < allDropItems.length; i++){
        let di = allDropItems[i];
        if(di.kind > 0 && Math.random() * di.denominator < dropItemRate)
            drops.push(this.itemObject(di.kind, di.dataId));
    }
    return drops;
};

Game_Troop.prototype.makeDropItems = function(){
    let drops = [];
    const deadMembers = this.deadMembers();
    for(let i = 0; i < deadMembers.length; i++){
        let enemy = deadMembers[i];
        Array.prototype.push.apply(drops, enemy.makeDropItems());
    }
    return drops;
};